继上一篇Service的启动过程(一),本篇将继续对service的另一种启动方式,即绑定service进行分析。
同样的,我们从ContextImpl的bindService开启这个流程的分析。
1 | //Service的绑定状态,绑定状态下的Service用于和组件进行交互 |
service的bind过程相比启动过程稍微复杂一点,因为bind需要将service绑定到组件上,这个需要通过一个回调来通知客户组件,bindServiceCommon中,首先会获取到一个IServiceConnection,实际上是个InnerConnection,它是个Binder,AMS端通过它来通知客户组件是否建立到Service的连接,随后通过Binder IPC调用bindService进一步的绑定操作。
1 | //service的绑定过程,这里的caller是个binder,它代表了应用端 |
AMS端的绑定过程做了以下几件事:
- 获取启动的service信息,同时会为要启动的service创建ServiceRecord(如果不存在的话)
- 为需要绑定的客户组件创建ConnectionRecord,它代表了一个客户连接。并将其存储在多个连接列表中方便存取。
- 通过bringUpServiceLocked启动service实例,这个方法我们之前介绍过.
- 通过requestServiceBindingLocked请求执行service的bind过程,这个最终会调用requestServiceBindingLocked通过ApplicationThread来通知应用端绑定service.
1 | //应用端service的绑定流程 |
从客户端绑定service的流程来看,它除了会回调service onBind来返回一个IBinder实体,这个IBinder实体它实际上是我们的服务实体,这里它将通过AMS的publishService来发布该服务,按理来说这是service的binder实体第一次穿过Binder驱动,驱动此时会记录下该Binder节点,同时service并不会被SM所知,因此我们的service实际上是作为一个匿名binder存在的。
1 | //在service执行完onBind的流程后 会返回一个Binder server,这里对其进行发布 |
通过publishServiceLocked发布的service client binder最终会通过客户组件注册的接口回调给客户端。